import AuthAPI, { LoginRequestData, LoginResponseData, InfoResponseData, AuthInfo } from "@/api/auth"

import { resetRouter } from "@/router"
import { store } from "@/store"

import { TOKEN_KEY } from "@/enums/CacheEnum"

export const useUserStore = defineStore("user", () => {
  const user = ref<AuthInfo>({
    detail: {},
    perms: [],
    roles: [],
    state: 0,
    token: "",
    username: "",
  })

  /**
   * 登录
   *
   * @param {LoginData}
   * @returns
   */
  function login(loginData: LoginRequestData) {
    return new Promise<void>((resolve, reject) => {
      AuthAPI.login(loginData)
        .then((res: LoginResponseData) => {
          const { token } = res.data
          if (token) {
            localStorage.setItem(TOKEN_KEY, token) // Bearer eyJhbGciOiJIUzI1NiJ9.xxx.xxx
          }
          resolve()
        })
        .catch((error) => {
          reject(error)
        })
    })
  }

  // 获取信息(用户昵称、头像、角色集合、权限集合)
  function getUserInfo() {
    return new Promise<AuthInfo>((resolve, reject) => {
      AuthAPI.getInfo()
        .then((res: InfoResponseData) => {
          const data = res.data
          if (!data) {
            reject("Verification failed, please Login again.")
            return
          }
          if (!data.roles || data.roles.length <= 0) {
            reject("getUserInfo: roles must be a non-null array!")
            return
          }
          //将roles的值也赋予perms
          user.value.perms = data.roles
          Object.assign(user.value, { ...data })
          resolve(data)
        })
        .catch((error) => {
          reject(error)
        })
    })
  }

  // user logout
  function logout() {
    return new Promise<void>((resolve, reject) => {
      localStorage.setItem(TOKEN_KEY, "")
      location.reload() // 清空路由
      resolve()
    })
  }

  // remove token
  function resetToken() {
    console.log("resetToken")
    return new Promise<void>((resolve) => {
      localStorage.setItem(TOKEN_KEY, "")
      resetRouter()
      resolve()
    })
  }

  return {
    user,
    login,
    getUserInfo,
    logout,
    resetToken,
  }
})

/**
 * 用于在组件外部（如在Pinia Store 中）使用 Pinia 提供的 store 实例。
 * 官方文档解释了如何在组件外部使用 Pinia Store：
 * https://pinia.vuejs.org/core-concepts/outside-component-usage.html#using-a-store-outside-of-a-component
 */
export function useUserStoreHook() {
  return useUserStore(store)
}
